package Datastructures.Queue;

public class ArrayQueue {
    private int maxSize;//数组最大容量
    private int front;//队头，front 就是指向队列的第一个元素，arr[front]就是队列的第一个元素，初始为0
    private int rear;//队尾，rear指向队列的最后一元素的后一个位置，采用空出一个位置作为队满的条件
    private int[]arr;//存放数据，模拟队列

    //创建队列构造器
    public ArrayQueue(int maxSize){
        this.maxSize=maxSize;
        arr=new int[maxSize];
    }
//判断队列是否已满
    public boolean isFull(){
        return (rear+1)%maxSize==front;//布尔型，返回是true就是true，是false就是false
    }
    //判断队列是否为空
    public boolean isEmpty(){
        return rear==front;//初始都为0，所以判断是否相等就判断队列是否为空
    }
    //添加数据到队列
    public void addQueeu(int n){
       //调用isfull（）判断队列是否已满
        if(isFull()){
            System.out.println("队满不能入队");
        }
        //直接加入队列
        arr[rear]=n;
        //rear后移，考虑取模，因为是循环队列，当rear达到最大容量，为了达到循环所以就进行取模，防止前面已有数据取出造成假溢出情况。
        rear=(rear+1)%maxSize;
    }
    //获取队列数据，出列
    public int getQueue(){
        if(isEmpty()){
            System.out.println("队kong不能入队");
        }
        int value=arr[front];
        front=(front+1)%maxSize;
        return value;
    }
    //显示所有数据
   public  void  showQueue(){
       if(isFull()){
           System.out.println("队空不能出队");
           return;
       }
       for(int i=front;i<front+size();i++) {
       System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
       }
   }
   //求当前队列有效数据个数
    public  int size(){
        return(rear+maxSize-front)%maxSize;
    }//1、当rear>front时，rear指向的是队尾后一个元素，所以比如容量10，rear=9，front=1，则有效数据为9-1=8，这是可以的。
    //2、当rear<front时，rear-front就为负了，为了为正，则让rear加上最大容量，再取模就可以了，所以综上就是(rear+maxSize-front)%maxSize。
    //显示队列头数据，不是取数据
public  int headQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列空，没有数据");
        }
        return arr[front];
}
}
